defmodule EliPhxPlayWeb do
  @moduledoc """
  定义Web界面的入口点，比如控制器、组件、通道等等。

  在你的应用中可以这样使用：

      use EliPhxPlayWeb, :controller
      use EliPhxPlayWeb, :html

  下面的定义会在每个控制器、组件等中执行，
  所以保持简短清晰，专注于导入、使用和别名。

  不要在下面的引用表达式中定义函数。
  相反，定义额外的模块并在这里导入这些模块。
  """

  # 定义静态资源路径
  def static_paths, do: ~w(assets fonts images favicon.ico robots.txt)

  # 路由配置模板
  def router do
    quote do
      use Phoenix.Router, helpers: false

      # 导入管道中使用的通用连接和控制器函数
      import Plug.Conn
      import Phoenix.Controller
      import Phoenix.LiveView.Router
    end
  end

  # 通道配置模板
  def channel do
    quote do
      use Phoenix.Channel
    end
  end

  # 控制器配置模板
  def controller do
    quote do
      use Phoenix.Controller,
        formats: [:html, :json],
        layouts: [html: EliPhxPlayWeb.Layouts]

      use Gettext, backend: EliPhxPlayWeb.Gettext

      import Plug.Conn

      unquote(verified_routes())
    end
  end

  # LiveView 配置模板
  def live_view do
    quote do
      use Phoenix.LiveView,
        layout: {EliPhxPlayWeb.Layouts, :app}

      unquote(html_helpers())
    end
  end

  # LiveComponent 配置模板
  def live_component do
    quote do
      use Phoenix.LiveComponent

      unquote(html_helpers())
    end
  end

  # HTML 组件配置模板
  def html do
    quote do
      use Phoenix.Component

      # 从控制器导入便利函数
      import Phoenix.Controller,
        only: [get_csrf_token: 0, view_module: 1, view_template: 1]

      # 包含用于渲染HTML的通用辅助函数
      unquote(html_helpers())
    end
  end

  # HTML 辅助函数集合
  defp html_helpers do
    quote do
      # 国际化翻译功能
      use Gettext, backend: EliPhxPlayWeb.Gettext

      # HTML 转义功能
      import Phoenix.HTML
      # 核心UI组件
      import EliPhxPlayWeb.CoreComponents

      # 生成JS命令的快捷方式
      alias Phoenix.LiveView.JS

      # 使用 ~p 符号生成路由
      unquote(verified_routes())
    end
  end

  # 验证路由配置
  def verified_routes do
    quote do
      use Phoenix.VerifiedRoutes,
        endpoint: EliPhxPlayWeb.Endpoint,
        router: EliPhxPlayWeb.Router,
        statics: EliPhxPlayWeb.static_paths()
    end
  end

  @doc """
  使用时，分发到相应的控制器/live_view等。
  """
  defmacro __using__(which) when is_atom(which) do
    apply(__MODULE__, which, [])
  end
end
